{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 任务说明\n",
    "\n",
    "- 任务主题：论文代码统计，统计所有论文出现代码的相关统计；\n",
    "- 任务内容：使用正则表达式统计代码连接、页数和图表数据；\n",
    "- 任务成果：学习正则表达式统计；"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 数据处理步骤\n",
    "\n",
    "在原始arxiv数据集中作者经常会在论文的`comments`或`abstract`字段中给出具体的代码链接，所以我们需要从这些字段里面找出代码的链接。\n",
    "\n",
    "- 确定数据出现的位置；\n",
    "- 使用正则表达式完成匹配；\n",
    "- 完成相关的统计；"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 正则表达式\n",
    "\n",
    "正则表达式(regular expression)描述了一种字符串匹配的模式（pattern），可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。\n",
    "\n",
    "#### 普通字符：大写和小写字母、所有数字、所有标点符号和一些其他符号\n",
    "\n",
    "| 字符       | 描述                                                         |\n",
    "| ---------- | ------------------------------------------------------------ |\n",
    "| **[ABC]**  | 匹配 [...] 中的所有字符，例如 [aeiou] 匹配字符串 \"google runoob taobao\" 中所有的 e o u a 字母。 |\n",
    "| **[^ABC]** | 匹配除了 **[...]** 中字符的所有字符，例如 **[^aeiou]** 匹配字符串 \"google runoob taobao\" 中除了 e o u a 字母的所有字母。 |\n",
    "| **[A-Z]**  | [A-Z] 表示一个区间，匹配所有大写字母，[a-z] 表示所有小写字母。 |\n",
    "| .          | 匹配除换行符（\\n、\\r）之外的任何单个字符，相等于 **[^\\n\\r]**。 |\n",
    "| **[\\s\\S]** | 匹配所有。\\s 是匹配所有空白符，包括换行，\\S 非空白符，包括换行。 |\n",
    "| **\\w**     | 匹配字母、数字、下划线。等价于 [A-Za-z0-9_]                  |\n",
    "\n",
    "#### 特殊字符：有特殊含义的字符\n",
    "\n",
    "| 特别字符 | 描述                                                         |\n",
    "| :------- | :----------------------------------------------------------- |\n",
    "| ( )      | 标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符，请使用 \\( 和 \\)。 |\n",
    "| *        | 匹配前面的子表达式零次或多次。要匹配 * 字符，请使用 \\*。     |\n",
    "| +        | 匹配前面的子表达式一次或多次。要匹配 + 字符，请使用 \\+。     |\n",
    "| .        | 匹配除换行符 \\n 之外的任何单字符。要匹配 . ，请使用 \\. 。    |\n",
    "| [        | 标记一个中括号表达式的开始。要匹配 [，请使用 \\[。            |\n",
    "| ?        | 匹配前面的子表达式零次或一次，或指明一个非贪婪限定符。要匹配 ? 字符，请使用 \\?。 |\n",
    "| \\        | 将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如， 'n' 匹配字符 'n'。'\\n' 匹配换行符。序列 '\\\\' 匹配 \"\\\"，而 '\\(' 则匹配 \"(\"。 |\n",
    "| ^        | 匹配输入字符串的开始位置，除非在方括号表达式中使用，当该符号在方括号表达式中使用时，表示不接受该方括号表达式中的字符集合。要匹配 ^ 字符本身，请使用 \\^。 |\n",
    "| {        | 标记限定符表达式的开始。要匹配 {，请使用 \\{。                |\n",
    "| \\|       | 指明两项之间的一个选择。要匹配 \\|，请使用 \\|。               |\n",
    "\n",
    "#### 限定符\n",
    "\n",
    "| 字符  | 描述                                                         |\n",
    "| :---- | :----------------------------------------------------------- |\n",
    "| *     | 匹配前面的子表达式零次或多次。例如，zo* 能匹配 \"z\" 以及 \"zoo\"。* 等价于{0,}。 |\n",
    "| +     | 匹配前面的子表达式一次或多次。例如，'zo+' 能匹配 \"zo\" 以及 \"zoo\"，但不能匹配 \"z\"。+ 等价于 {1,}。 |\n",
    "| ?     | 匹配前面的子表达式零次或一次。例如，\"do(es)?\" 可以匹配 \"do\" 、 \"does\" 中的 \"does\" 、 \"doxy\" 中的 \"do\" 。? 等价于 {0,1}。 |\n",
    "| {n}   | n 是一个非负整数。匹配确定的 n 次。例如，'o{2}' 不能匹配 \"Bob\" 中的 'o'，但是能匹配 \"food\" 中的两个 o。 |\n",
    "| {n,}  | n 是一个非负整数。至少匹配n 次。例如，'o{2,}' 不能匹配 \"Bob\" 中的 'o'，但能匹配 \"foooood\" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。 |\n",
    "| {n,m} | m 和 n 均为非负整数，其中n <= m。最少匹配 n 次且最多匹配 m 次。例如，\"o{1,3}\" 将匹配 \"fooooood\" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。 |\n",
    "\n",
    "## 具体代码实现以及讲解\n",
    "\n",
    "首先我们来统计论文页数，也就是在`comments`字段中抽取pages和figures和个数，首先完成字段读取。\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-02T07:29:48.711453Z",
     "start_time": "2021-01-02T07:29:48.059043Z"
    }
   },
   "outputs": [],
   "source": [
    "# 导入所需的package\n",
    "import seaborn as sns #用于画图\n",
    "from bs4 import BeautifulSoup #用于爬取arxiv的数据\n",
    "import re #用于正则表达式，匹配字符串的模式\n",
    "import requests #用于网络连接，发送网络请求，使用域名获取对应信息\n",
    "import json #读取数据，我们的数据为json格式的\n",
    "import pandas as pd #数据处理，数据分析\n",
    "import matplotlib.pyplot as plt #画图工具"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-02T07:30:10.507358Z",
     "start_time": "2021-01-02T07:29:49.676050Z"
    }
   },
   "outputs": [],
   "source": [
    "def readArxivFile(path, columns=['id', 'submitter', 'authors', 'title', 'comments', 'journal-ref', 'doi',\n",
    "       'report-no', 'categories', 'license', 'abstract', 'versions',\n",
    "       'update_date', 'authors_parsed'], count=None):\n",
    "    '''\n",
    "    定义读取文件的函数\n",
    "        path: 文件路径\n",
    "        columns: 需要选择的列\n",
    "        count: 读取行数\n",
    "    '''\n",
    "    \n",
    "    data  = []\n",
    "    with open(path, 'r') as f: \n",
    "        for idx, line in enumerate(f): \n",
    "            if idx == count:\n",
    "                break\n",
    "                \n",
    "            d = json.loads(line)\n",
    "            d = {col : d[col] for col in columns}\n",
    "            data.append(d)\n",
    "\n",
    "    data = pd.DataFrame(data)\n",
    "    return data\n",
    "\n",
    "data = readArxivFile('arxiv-metadata-oai-snapshot.json', ['id', 'abstract', 'categories', 'comments'])\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "对pages进行抽取："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-02T07:30:15.199110Z",
     "start_time": "2021-01-02T07:30:10.718931Z"
    }
   },
   "outputs": [],
   "source": [
    "# 使用正则表达式匹配，XX pages\n",
    "data['pages'] = data['comments'].apply(lambda x: re.findall('[1-9][0-9]* pages', str(x)))\n",
    "\n",
    "# 筛选出有pages的论文\n",
    "data = data[data['pages'].apply(len) > 0]\n",
    "\n",
    "# 由于匹配得到的是一个list，如['19 pages']，需要进行转换\n",
    "data['pages'] = data['pages'].apply(lambda x: float(x[0].replace(' pages', '')))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "对pages进行统计，统计结果如下：论文平均的页数为17页，75%的论文在22页以内，最长的论文有11232页。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-02T07:30:27.468809Z",
     "start_time": "2021-01-02T07:30:27.383009Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "count    1089180\n",
       "mean          17\n",
       "std           22\n",
       "min            1\n",
       "25%            8\n",
       "50%           13\n",
       "75%           22\n",
       "max        11232\n",
       "Name: pages, dtype: int64"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data['pages'].describe().astype(int)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "接下来按照分类统计论文页数，选取了论文的第一个类别的主要类别："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-02T07:30:59.170351Z",
     "start_time": "2021-01-02T07:30:58.096126Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<AxesSubplot:xlabel='categories'>"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 864x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 选择主要类别\n",
    "data['categories'] = data['categories'].apply(lambda x: x.split(' ')[0])\n",
    "data['categories'] = data['categories'].apply(lambda x: x.split('.')[0])\n",
    "\n",
    "# 每类论文的平均页数\n",
    "plt.figure(figsize=(12, 6))\n",
    "data.groupby(['categories'])['pages'].mean().plot(kind='bar')\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "接下来对论文图表个数进行抽取："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-02T07:31:16.225134Z",
     "start_time": "2021-01-02T07:31:12.823092Z"
    }
   },
   "outputs": [],
   "source": [
    "data['figures'] = data['comments'].apply(lambda x: re.findall('[1-9][0-9]* figures', str(x)))\n",
    "data = data[data['figures'].apply(len) > 0]\n",
    "data['figures'] = data['figures'].apply(lambda x: float(x[0].replace(' figures', '')))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "最后我们对论文的代码链接进行提取，为了简化任务我们只抽取github链接：\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-02T07:32:16.121702Z",
     "start_time": "2021-01-02T07:32:15.033667Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/usr/local/lib/python3.6/dist-packages/ipykernel_launcher.py:6: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame.\n",
      "Try using .loc[row_indexer,col_indexer] = value instead\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  \n",
      "/usr/local/lib/python3.6/dist-packages/ipykernel_launcher.py:10: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame.\n",
      "Try using .loc[row_indexer,col_indexer] = value instead\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  # Remove the CWD from sys.path while we load stuff.\n"
     ]
    }
   ],
   "source": [
    "# 筛选包含github的论文\n",
    "data_with_code = data[\n",
    "    (data.comments.str.contains('github')==True)|\n",
    "                      (data.abstract.str.contains('github')==True)\n",
    "]\n",
    "data_with_code['text'] = data_with_code['abstract'].fillna('') + data_with_code['comments'].fillna('')\n",
    "\n",
    "# 使用正则表达式匹配论文\n",
    "pattern = '[a-zA-z]+://github[^\\s]*'\n",
    "data_with_code['code_flag'] = data_with_code['text'].str.findall(pattern).apply(len)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "并对论文按照类别进行绘图："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-01-02T07:32:29.528795Z",
     "start_time": "2021-01-02T07:32:29.374662Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<AxesSubplot:xlabel='categories'>"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 864x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "data_with_code = data_with_code[data_with_code['code_flag'] == 1]\n",
    "plt.figure(figsize=(12, 6))\n",
    "data_with_code.groupby(['categories'])['code_flag'].count().plot(kind='bar')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.9"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
